﻿// Inner Fire 游戏引擎库
// 根签名管理类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 这个类提供根签名的模块化管理。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-07

#pragma once

#include <dx/core/dx_core.h>
#include <dx/graphics/dx_module.h>

namespace ifire::dx {

// 用于普通光源的Slot
enum ShaderSlot : int {
  // 标准SLOT
  TEXTURE = 0,
  OBJECT_CB = 1,
  MAIN_PASS = 2,
  SKINNED_CB = 3,
  MATERIAL = 4,
  NORMAL_MAP = 5,
  SKYBOX = 6,
  TEXTURE_ARRAY = 7,
  DISPLACEMENT = 8,
  SLOTS = 9,

  // ParticleSlot
  PARTICLE_DATA = 3,
};

class DxRootSignature : public DxModule {
public:
  DxRootSignature(DxGraphics* dx);
  DxRootSignature(const DxRootSignature& rhs) = delete;
  DxRootSignature& operator=(const DxRootSignature& rhs) = delete;
  ~DxRootSignature() = default;

  void BuildRootSignature();

  void CreateRootSignature(const CD3DX12_ROOT_SIGNATURE_DESC& desc,
      ComPtr<ID3D12RootSignature>& sign);

public:
  // 标准根签名
  ComPtr<ID3D12RootSignature> mStandard;
  // Ssao根签名
  ComPtr<ID3D12RootSignature> mSsao;
  // 波浪
  ComPtr<ID3D12RootSignature> mWaves;
  // 后处理
  ComPtr<ID3D12RootSignature> mPostProcessing;
  // 文字(UI以后也用这个）
  ComPtr<ID3D12RootSignature> mUI;
  // 粒子
  ComPtr<ID3D12RootSignature> mParticle;

private:
  void BuildStandard();
  void BuildSsao();
  void BuildPostProcess();
  void BuildWaves();
  void BuildUI();
  void BuildParticle();
};

} // namespace ifire::dx